Arduino MEGA 2560清除中断标志位

您所在的位置:网站首页 arduino 2560中断 Arduino MEGA 2560清除中断标志位

Arduino MEGA 2560清除中断标志位

2023-09-29 15:05| 来源: 网络整理| 查看: 265

        Arduino 开发板在使用时会遇到手动清除外部中断标志位的情况,比如为了防止误触,在attachInterrupt()函数前复位待使用的中断标志位。

        一个外部中断0发生时在中断函数内detachInterrupt另外一个中断1,执行程序过程中外部触发中断1,但是由于失能,不能响应。程序执行后attachInterrupt被失能的中断1,然后系统会响应中断1的中断函数。就是中断1的响应虽然失能了,但是再次使能时又会响应失能期间的中断。是这样的吗?现在做两个红外传感器的外部中断,它们都会被先后触发,先触发哪个就响应哪个的程序,不响应后触发的程序。出现这种现象是因为AVR底层是这样的,中断分为“请求”和“使能”两层结构。事件发生后“请求”被硬件置位,只要“使能”开启就会依优先级进行中断。 attach/detach 两个函数都是只操作了“使能”控制位,而请求被保持了,才会造成上数局面。非要清除请求的话,直接在 寄存器的层面是请求位写 1,即可清除“请求”。Arduino UNO设置两个外部中断的问题-Arduino中文社区 - Powered by Discuz!

        Arduino UNO直接操作EIFR寄存器就可以:

EIFR= _BV(INTF0); // Clear INT0 Request//清除UNO中断0请求 EIFR= _BV(INTF1); // Clear INT1 Request//清除UNO中断1请求

        Arduino UNO只有两个中断,有些项目会使用Arduino MGEA 2560控制器(有6个中断中断0~5)。Arduino MEGA 2560操作EIFR寄存器有些不一样

EIFR = _BV(INTF4); //清除MEGA 2560中断0请求标志位//引脚2 EIFR = _BV(INTF5); //清除MEGA 2560中断1请求标志位//引脚3 EIFR = _BV(INTF0); //清除MEGA 2560中断2请求标志位//引脚21 EIFR = _BV(INTF1); //清除MEGA 2560中断3请求标志位//引脚20 EIFR = _BV(INTF2); //清除MEGA 2560中断4请求标志位//引脚19 EIFR = _BV(INTF3); //清除MEGA 2560中断5请求标志位//引脚18

        使用这种直接操作寄存器还是少数情况,改变程序结构也可以达到相同效果。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3